package
{
	import flash.display.DisplayObject;
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.IEventDispatcher;
	import flash.geom.PerspectiveProjection;
	import flash.utils.getTimer;
	
	import flashx.textLayout.events.UpdateCompleteEvent;
	
	public class Animate extends EventDispatcher//обобщенный класс перемещения объекта.Необходим чтобы при падении FPS игра не становилась медленне а просто двигалась рывками. в гонке необходимо,иначе при зависании это уже не гонка а черепашка.лучше пожертвовать графой
//кроме того он позволяет отделить работу с анимацией и спецыфектами от самого объекта. можно будет навесит сглаживания деформации blur	
	{
		private var target:DisplayObject;//можем перемещать ЛЮБОЙ объект
		private var startTime:Number;//время начала движения
		private var duration:Number;//длительность анимации в секундах
		private var startX:Number;//начальные координаты объекта
		private var startY:Number;
		private var deltaX:Number;//расстояние между начальным и конечным положением объекта
		private var deltaY:Number;
		
		public function Animate(target:DisplayObject)//конструктор принимает ссылку на объект
		{
			this.target=target;
		}
		public function moveTo(toX:Number,toY:Number,duration:Number):void{
			startX=target.x;//сохраняем начальное положение объекта
			startY=target.y;
			
			deltaX=toX-target.x;//фиксируем разницу между начальными и будущими координатами
			deltaY=toY=target.y;
			startTime=getTimer();
			this.duration=duration;//запоминаем длительность перемещения
			target.addEventListener(Event.ENTER_FRAME,listener);
		}
		private function listener(e:Event):void{
			var elapsed:Number=getTimer()-startTime;//время с начала анимации
			var percentDone:Number=elapsed/duration;//сколько процентов анимации завершено
			
			if(percentDone<1){//если анимация еще не завершена то
				updatePosition(percentDone);//обновляем положение объекта
			}else{
				updatePosition(1);
				target.removeEventListener(Event.ENTER_FRAME,listener);
			}
		}
		//устанавливаем позицию объекта,выраженную через процент завершенности анимации
		private function updatePosition(percentDone:Number):void{
			target.x=startX+deltaX*percentDone;
			target.y=startY+deltaY*percentDone;
		}
	}
}